Introducción

Los accidentes viales representan un serio problema de salud pública, en un estudio realizado por la OMS en conjunto con el Banco Mundial, aparecen como la séptima causa de morbilidad en el planeta, las cifras muestran que en el mundo, más de 1.25 millones de personas fallece cada año en las vías y además generan un alto costo para las naciones.

Los accidente de transito se originan por condiciones del vehículo (factor mecánico), ambientales (factor climático) y en gran medida por factores humanos.

Se ha identificado que el factor humano está relacionado a más del 90% de los accidentes de tránsito. Las percepciones de la población sobre la causalidad de éstos, refleja que son debido a la irresponsabilidad de los conductores donde el alcohol, falta de respeto por las señales de tránsito, exceso de velocidad, uso de móviles, entre otros, son factores que desencadenan los accidentes; por otro lado, los peatones también son percibidos como responsables.

Hay varias formas de enfrentar dicha problemática, por ejemplo los programas de educación y respeto por las normas de tránsito y la disposición de la tecnología para el mejoramiento preventivo no sólo a partir de la mejora de los vehículos, sino también, del aprovechamiento de los grandes conjuntos de datos que proveen los datos abiertos, con el fin de estimular decisiones más oportunas e informadas.

Situación en Medellín

La alta accidentalidad en Medellín se ha convertido en un problema de salud pública, por ejemplo, en 2017 y 2018 murieron 254 y 314 personas respectivamente por incidentes de tránsito, además continúa en la cabeza de las ciudades con más accidentes de tránsito en el país, a pesar de la reducción de las cifras en los últimos tres años, lo que significa que se deben reforzar las acciones que se están realizando en esta materia. En Medellín se ha aumentado la señalización, la contratación con la agencia nacional de seguridad vial, medidores de velocidad, pero se siguen presentados accidentes, en mayor cantidad por motociclistas y peatones. En el caso de los peatones se evidencia que más de la mitad de los sucesos se ve involucrado un motoclista por atropello. En estudios previos por la secretaria de tránsito, se señala que muchos de los accidentes se presentan en barrios residenciales y se atribuye a que los motociclistas no utilizan la indumentaria adecuada para la prevención de estos accidentes. Esta problemática también afecta la calidad del aire de la ciudad, por cada incidente se congestionan las vías por una hora aproximadamente, lo cual genera mayor carburación de los vehículos que se encuentran allí, causando altas emisiones de dióxido de carbono que a su vez generan más contaminación ambiental.

Objetivo

Crear un modelo que permita predecir la accidentalidad en Medellín por tipo de accidente a nivel diario, semanal y mensual.

Realizar un agrupamiento de los barrios de Medellín de acuerdo a su accidentalidad.

Crear un aplicación web que permita a los usuarios finales visualizar los datos históricos y hallazgos de valor en los datos, calcular prediciones de los accidentes diarios, semanales y mensuales y finalmente que permita visualizar en un mapa una agrupación de los barrios de Medellín de acuerdo a su accidentalidad.

Datos

Los datos se obtuvieron de la página de Open Data de la alcaldía de Medellín: [https://geomedellin-m-medellin.opendata.arcgis.com/]. Se usaran los datos de los años 2014, 2015, 2016, 2017 para el entrenamiento y 2018 para la validación de los modelos propuestos. Para cada año se tiene la siguiente información:

1. Analisis descriptivo

En el análisis descriptivo y exploratorio de los datos se realizaron gráficos que permiten observar el comportamiento de las variables y posibles relaciones entre éstas.

Lectura datos

Se leen los datos

D2014<-read.csv("Accidentalidad_georreferenciada_2014.csv")
D2015<-read.csv("Accidentalidad_georreferenciada_2015.csv")
D2016<-read.csv("Accidentalidad_georreferenciada_2016.csv")
D2017<-read.csv("Accidentalidad_georreferenciada_2017.csv")
D2018<-read.csv("Accidentalidad_georreferenciada_2018.csv")
d<-rbind(D2014,D2015,D2016,D2017,D2018)
head(d)
##        ï..X        Y OBJECTID RADICADO                  FECHA     HORA DIA
## 1 -75.60273 6.219016   211279  1423828 2014/01/01 00:00:00+00 02:20:00   1
## 2 -75.56818 6.260009   211280  1423839 2014/01/01 00:00:00+00 12:50:00   1
## 3 -75.54994 6.264765   211281  1423840 2014/01/01 00:00:00+00 01:00:00   1
## 4 -75.60761 6.234327   211282  1423849 2014/01/01 00:00:00+00 12:37:00   1
## 5 -75.57969 6.299968   211283  1423890 2014/01/01 00:00:00+00 10:40:00   1
## 6 -75.55543 6.284499   211284  1423892 2014/01/01 00:00:00+00 04:00:00   1
##   PERIODO              CLASE    DIRECCION            DIRECCION_ENC CBML
## 1    2014             Choque   CR 80 CL 8 CR  080   008  000 00000 1611
## 2    2014          Atropello  CR 53 CL 61 CR  053   061  000 00000 1003
## 3    2014          Atropello  CR 39 CL 70 CR  039   070  000 00000 0308
## 4    2014          Atropello  CL 32 CR 84 CL  032   084  000 00000 1617
## 5    2014 Caída de Ocupante CR 80 CL 101 CR  080   101  000 00000 0603
## 6    2014             Choque  CR 48 CL 93 CR  048   093  000 00000 0401
##                      TIPO_GEOCOD GRAVEDAD               BARRIO          COMUNA
## 1 Malla vial aproximada: CR 81-7   HERIDO   Loma de los Bernal          Belén
## 2                     Malla vial   HERIDO      Jesús Nazareno   La Candelaria
## 3                     Malla vial   HERIDO    Manrique Oriental        Manrique
## 4                     Malla vial   HERIDO         Las Mercedes          Belén
## 5                     Malla vial   HERIDO Doce de Octubre No.2 Doce de Octubre
## 6                     Malla vial   HERIDO               Berlin        Aranjuez
##         DISENO DIA_NOMBRE MES MES_NOMBRE X_MAGNAMED Y_MAGNAMED  LONGITUD
## 1 Tramo de via MIÉRCOLES   1         NA   831190.1    1179690 -75.60273
## 2 Tramo de via MIÉRCOLES   1         NA   835013.6    1184224 -75.56818
## 3 Tramo de via MIÉRCOLES   1         NA   837032.7    1184750 -75.54994
## 4 Tramo de via MIÉRCOLES   1         NA   830649.5    1181383 -75.60761
## 5 Tramo de via MIÉRCOLES   1         NA   833740.8    1188644 -75.57969
## 6 Interseccion MIÉRCOLES   1         NA   836425.4    1186933 -75.55543
##    LATITUD
## 1 6.219016
## 2 6.260009
## 3 6.264765
## 4 6.234327
## 5 6.299968
## 6 6.284499

Se consolida la información en una sóla base de datos y se realizan cambios de formatos, se agrega la variable cantidad que indica la cantidad o número de accidentes. Además se realiza homologación a la variable clase (los incendios y N/A se agregan a la clase Otro), se obtienen 5 clases:

  • Choque
  • Atropello
  • Caida ocupante
  • Otro
  • volcamientos

Análisis gráficos

Se observa que el número de accidentes por año es casi constante, sin embargo en el año 2018 disminuyeron en un 6% respecto a 2017.

## Warning: `arrange_()` is deprecated as of dplyr 0.7.0.
## Please use `arrange()` instead.
## See vignette('programming') for more help
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.

A partir de ésta gráfica se observa que en los meses de marzo, mayo y agosto en la mayoría de años se presentan picos de accidentalidad y tiende a haber diminuciones en los meses de enero, abril, junio y noviembre. Siendo enero el mes con menor número de casos. En el 2016 se observan varios picos que no se presentaron en los otros años.

## 
##      Atropello Caida Ocupante         Choque           Otro    Volcamiento 
##       9.711710       9.233339      66.655298      11.023075       3.376579

Se puede notar que el tipo de accidente más frecuente es el choque con un total de 152436 casos representado un 67% de los casos.

Se observa que el día en el que ocurren mas accidentes es el viernes seguido del martes, el día con menos accidentes es el domingo y la clase que domina en todo los días es el choque.

## 
##     HERIDO     MUERTO SOLO DAÑOS 
## 55.1927693  0.6008054 44.2064252

En el periodo de tiempo estudiado (2014-2018), la gravedad del accidente más frecuente es herido con 126222 casos (55%), seguido de sólo daños con 101097 (44%) y muerto con 1374 (0.6%).

En la clase choque predomina la gravedad del accidente en el que hay sólo daños y los heridos, en el resto de clases predominan los heridos.Es de resaltar que los muertos en la clase de accidente atropello representan un 3%.

Se observa que en todas las clases predominan los accidentes en tramos de vía seguido de las intersecciones.

2. Agrupamiento

El objetivo es clasificar los barrios por su accidentalidad, para esto se un hizo un modelo de Clusterización K-means. Las variables que se consideraron para construir la segmentación fueron, el día de la semana y el mes donde se presenta el suceso, la clase de accidente, la gravedad del accidente, el diseño de la vía y por último la comuna. Después de realizar las debidas validaciones de esta segmentación se decidió tomar un total de 5 clúster donde se verán reflejadas las características de cada uno de los K-Cluster.

Del siguiente gráfico se puede observar que el numero de clusters adecuado es 5.

Este gráfico muestra la distribución de los barrios por cluster.

Después de ejecutar el agrupamiento con los 5 cluster se obtiene que el grupo 1 está conformado por los barrios de menor accidentalidad, seguido por el grupo 3, el grupo 5, el grupo 2 y finalmente el 4 que está conformado por los barrios con mas casos de accidentes.

3. Predicción

Esta basada en un modelo predictivo bajo la metodología de Random Forest, el cual presenta un MSE más favorable en comparación a las otras metodologías de prueba como lo fueron SMV, Redes neuronales y un modelo GLM (poisson). El modelo se entrenó con los años de accidentabilidad de 2014 a 2017, tomando las variables de clase de accidente, día de la semana, mes del accidente, diseño de la via y se agregó la variable de fechas especiales. Al final se elige el modelo con menor MSE de 19.3, lo que quiere decir que se está equivocando en promedio en 19 accidentes.

La variable fecha especial se creó como una variable indicadora donde es 1 si es una fecha especial (si ocurre alguno de estos eventos: Festivo, Semana Santa, Día de la Madre, Día del Padre, Feria de Flores, Amor y Amistad, Hallowen, Quincena, Alborada, Velitas, Navidad y Fin de Año) y 0 si no es fecha especial.

Random Forest

Se obtiene un MSE de 19.6

#####modelo1
set.seed(88)
modelo1<-randomForest(conteo~.,data =entrenamientofin)

entrenamientomod$MES<-as.factor(entrenamientomod$MES)


prediccion1<-predict(modelo1,validacion)

resultados1<-data.frame(validacion,prediccion1,2018)
names(resultados1)[9] = "PERIODO"

  
resultados1$MES_NUMERO<-case_when( resultados1$MES=="ENERO" ~ "1",
                             resultados1$MES=="FEBRERO" ~ "2",
                             resultados1$MES=="MARZO" ~ "3",
                             resultados1$MES=="ABRIL" ~ "4",
                             resultados1$MES=="MAYO" ~ "5",
                             resultados1$MES=="JUNIO" ~ "6",
                             resultados1$MES=="JULIO" ~ "7",
                             resultados1$MES=="AGOSTO" ~ "8",
                             resultados1$MES=="SEPTIEMBRE" ~ "9",
                             resultados1$MES=="OCTUBRE" ~ "10",
                             resultados1$MES=="NOVIEMBRE" ~ "11",
                             resultados1$MES=="DICIEMBRE" ~ "12",
                             TRUE ~ "raro") 
  


prubmse<-((resultados1$conteo)-(resultados1$prediccion1))^2
prubmse<-as.vector(prubmse)
mean(prubmse)
## [1] 19.61147

SVM

Se obtiene un MSE de 194.29

#######modelo2

modelo2<-svm(conteo~.,data =entrenamientofin,kernel="linear",cost=10,scale = FALSE)
prediccion2<-predict(modelo2,validacion)
resultados2<-data.frame(validacion,prediccion2)
prubmse2<-((resultados2$prediccion2)-(resultados2$conteo))^2
prubmse2<-as.vector(prubmse2)
mean(prubmse2)
## [1] 194.2908

glm

Se obtiene un MSE de 134.89

########modelo3

modelo3<-glm(conteo~.,data =entrenamientofin)
prediccion3<-predict(modelo3,validacion)
resultados3<-data.frame(validacion,prediccion3)
prubmse3<-((resultados3$prediccion3)-(resultados3$conteo))^2
prubmse3<-as.vector(prubmse3)
mean(prubmse3)
## [1] 134.8922

Red neuronal

Se usó una red neuronal con 5 capas y cada capa con 5 neuronas con la función de activación rectifier.

Se obtiene un MSE de 40.3

########modelo4
#h2o.init(nthreads = -1)
#classifier = h2o.deeplearning(y = 'conteo',
                              #training_frame = as.h2o(entrenamientofin),
                              #activation = 'Rectifier',
                              #hidden = c(5, 5),
                              #epochs = 100,
                              #train_samples_per_iteration = -2)
#modelo4<-neuralnet(conteo~.,data =entrenamientofin)
#prob_pred <- h2o.predict(classifier, newdata = as.h2o(validacion))

#prueba1<-as.data.frame(prob_pred)
#resultados4<-data.frame(validacion,prueba1$predict)
#prubmse4<-((resultados4$prueba1.predict)-(resultados4$conteo))^2
#prubmse4<-as.vector(prubmse4)
#mean(prubmse4)